package com.zeratul.common.core.utils;

import cn.hutool.core.util.ObjectUtil;
import com.zeratul.common.core.utils.spring.SpringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;

import java.util.Locale;

/**
 * 国际化工具方法
 */
@Slf4j
public class I18nUtils {

    private static MessageSource messageSource;

    private static MessageSource getMessageSource(){
        if (ObjectUtil.isNotNull(messageSource)) {
            return messageSource;
        }

        messageSource = SpringUtils.getBean(MessageSource.class);
        log.debug("【初始化国际化工具类】加载MessageSource:{}", messageSource);
        return messageSource;
    }

    /**
     * 通过code获取国际化信息，默认返回code本身
     * @param code
     * @return
     */
    public static String getMessage(String code) {
        return getMessage(code, code);
    }

    /**
     * 通过code获取国际化信息，默认值版本
     * @param code
     * @return
     */
    public static String getMessage(String code, String defaultValue) {
        return getMessage(code, null, defaultValue);
    }

    /**
     * 通过code获取国际化信息，默认值版本
     * @param code
     * @return
     */
    public static String getMessage(String code, String[] args, String defaultValue) {
        return getMessage(code, args, LocaleContextHolder.getLocale(), defaultValue);
    }

    /**
     * 通过code获取国际化信息，手动指定语言版本
     * @param code
     * @return
     */
    public static String getMessage(String code, String[] args, Locale locale, String defaultValue) {
        try {
            return getMessageSource().getMessage(code, args, locale);
        } catch (Exception e) {
            return defaultValue;
        }
    }

    /**
     * 根据语言字符串获取语言环境对象Locale
     */
    public static Locale getLocale(String language, String defaultValue) {
        try {
            if (ObjectUtil.isEmpty(language)) {
                //如果不存在则直接采用默认值
                language = defaultValue;
            }
            String[] split = language.split("_");
            if (split.length == 2) {
                return new Locale(split[0], split[1]);
            } else {
                return new Locale(split[0]);
            }
        } catch (Exception e) {
            return Locale.getDefault();
        }
    }
}
